<?php

/**************** 4.11 检查一个元素是否在数组中 ******************/

// 问题：希望知道一个数组是否包含某个值

// 解决方案： in_array()

$array = ['apple', 'banana', 'pine'];
$value = 'apple';
if (in_array($value, $array)) {
    echo $value, PHP_EOL;
}

$book_collectioin = ['Emma', 'Pride and Prejudice', 'Northhanger Abbey'];
$book = 'Sense and Sensibility';

if (in_array($book, $book_collectioin)) {
    echo "Own it.", PHP_EOL;
} else {
    echo 'Need it.', PHP_EOL;
}

/*******************************************************
 * in_array() 的默认行为时使用 == 操作符来比较元素。
 * 要使用严格相等性检查。需要将 true 作为第三个参数传递
 */

$array = [1, '2', 'three'];

$r0 = in_array(0,$array);// true   因为将数字 0 与字符串 three 比较时 php 把 three 强制转换为一个整数
$rs0 = in_array(0,$array,true);
$r1 = in_array(1,$array);
$rs1 = in_array(1,$array,true);
$r2 = in_array(2,$array);
$rs2 = in_array(2,$array,true);
$r3 = in_array(3,$array);
$rs3 = in_array(3,$array,true);

var_dump($r0,$rs0);
var_dump($r1,$rs1);
var_dump($r2,$rs2);
var_dump($r3,$rs3);

/*******************************************************************
 *
 * 如果发现会对同一个数组多次调用 in_array() 可能更好的做法使用一个关联数组
 * 使用 in_array 需要线性时间 如果利用关联数组查找 仅需常量时间
 * 如果不能直接创建关联数组，而需要由一个整数键的传统数组转换，可以使用 array_flip()
 * 交换数组的键和值
 * 如果有相同的值 转换后会 浓缩 为一个元素
 */


$book_collectioin = ['Emma', 'Pride and Prejudice', 'Northhanger Abbey'];
$book = 'Sense and Sensibility';

// 转换关联数组
$book_collectioin = array_flip($book_collectioin);

if (isset($book_collectioin[$book])) {
    echo "Own it.", PHP_EOL;
} else {
    echo 'Need it.', PHP_EOL;
}

